import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os

mnist = input_data.read_data_sets('E:/1-CODE/code_reference/cnn_handwritting/MNIST_data',
 one_hot=True)


# 样本数
print("训练数据大小：", mnist.train.num_examples)
print("验证数据大小：", mnist.validation.num_examples)
print("测试数据大小：", mnist.test.num_examples)

# 标签和数据
mnist.train.labels[0]
mnist.train.images[0]

# 取一撮数据，准备喂入神经网络
BATCH_SIZE = 200
xs, ys = mnist.train.next_batch(BATCH_SIZE)
print ("xs shape:", xs.shape)  # 28x28=784 points
print ("ys shape:", ys.shape)

# 常用函数
tf.get_collection("")  # 函数表示从collection 集合中取出全部变量生成一个列表
tf.add_n([]) # 参数列表中对应元素相加
tf.cast(x,dtype) # 将参数x转换为指定数据类型
tf.equal() # 对比两个矩阵或者向量的元素，相等返True
tf.reduce_mean(x,axis)  # 求取矩阵或张量指定维度的平均值。若不指定第二个参数，
# 则在所有元素中取平均值；指定0，第一维求平均值，每一列求一个平均值
tf.argmax(x,axis) # 指定维度下最大值的索引
os.path.join("home","...","name") # 表示把参数字符串按照路径命名规则拼接
字符串.split() # 按指定拆分符对字符串进行拆分，返回拆分列表，例
'./model/mnist_model-1001'.split('/')[-1].split('-')[-1]
# 存在两次拆分，第一次按/进行，返回拆分列表，并提索引-1，也就是倒数第一个元素
# 第二次按-进行，也提取倒数第一个元素。最终输出是1001
tf.Graph().as_default() # 表示将当前图设置为默认图，并返回一个上下文管理器。
# 该函数一般与 with 关键字搭配使用，应用于将已经定义好的神经网络复现在计算图中，例
tf.Graph().as_default() as g  # 将Graph()内定义的节点加入到计算图g中


# 模型保存
saver = tf.train.Saver()  # 实例化 saver 对象
with tf.Session()as sess:
    for i in range(STEPS):
        if i% 轮数 == 0：
        saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)

# 模型加载
with tf.Session()as sess:
    ckpt = tf.train.get_checkpoint_state(存储路径)
        if ckpt and ckpt.model_checkpoint_path:  # 若ckpt和保存的模型在指定路径中存在
        saver.restore(sess, ckpt.model_checkpoint_path)

# 加载模型中参数的滑动平均值
ema = tf.train.ExponentialMovingAverage(滑动平均基数)
ema_restore = ema.variables_to_restore()
saver = tf.train.Saver(ema_restore)

# 准确率计算方法
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) # 1表示尽在第一维，也就是行上进行取最大值的索引操作
# cast 将一个bool转换为实数值，再计算平均值
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


